import ReactDOM from 'react-dom';

//在index.js中引入axios
import axios from 'axios';
//引入qs模块，用来序列化post类型的数据
import QS from 'qs';
import { message, Spin } from 'antd'
import { createBrowserHistory } from 'history';
import { REFRESHTOKENRUI, OCPAPIMSUBSCRIPTIONKEY, FORMDATA_URL } from '../utils/constant';
import { enMsg } from './errMessage';
import { getUserData } from '../utils/commonUtil';

// const isPrd = process.env.NODE_ENV == 'production';

// //区分开发环境还是生产环境基础URL
// export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

//设置axios基础路径
const api = axios.create({
  baseURL: ''
})

// 当前正在请求的数量
let requestCount = 0
const history = createBrowserHistory();
// 显示loading
function showLoading () {
  if (requestCount === 0) {
    var dom = document.createElement('div')
    dom.setAttribute('id', 'loading')
    document.body.appendChild(dom)
    ReactDOM.render(<Spin tip="加载中..." size="large" />, dom)
  }
  requestCount++
}

// 隐藏loading
function hideLoading () {
  requestCount--
  if (requestCount === 0) {
    document.body.removeChild(document.getElementById('loading'))
  }
}



// 请求拦截器
api.interceptors.request.use(config => {
  // 每次发送请求之前本地存储中是否存在token，也可以通过Redux这里只演示通过本地拿到token
  // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
  // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
  //在每次的请求中添加token
  //获取登录信息
  // let userInfo = localStorage.getItem('userData');
  // let userInfoJson = userInfo && JSON.parse(userInfo);
  let currentUser = getUserData();
  let token = currentUser['access_token'];
  let themeKey = sessionStorage.getItem("themeKey");

  //设置请求头
  if (FORMDATA_URL.includes(config.url)) {
    config.headers = {
      "Content-Type": "multipart/form-data",
      token: token,
      username: currentUser?.username,
      butype: themeKey
    }
  } else if (config.url.includes('pingid/code/validate')) {
    config.headers = {
      "Content-Type": "application/json",
      'Ocp-Apim-Subscription-Key': OCPAPIMSUBSCRIPTIONKEY
    }
  } else {
    config.headers = {
      'Content-Type': 'application/json',
      token: token,
      username: currentUser?.username,
      butype: themeKey
    }
  }
  if (config.url.includes('/analysis/trend/batchplot') || config.url.includes('/analysis/ttest/batchplot')) {
    config.timeout = 600000;
  };

  //拦截下载请求，增加type
  if (config.url.includes('export') || config.url.includes('download')) {
    config.responseType = 'blob';
  }

  // requestCount为0，才创建loading, 避免重复创建
  if (config.headers.isLoading !== false && !config.url.includes('sys/notice/list')) {
    showLoading()
  }
  //序列化请求参数，不然post请求参数后台接收不正常
  // config.data = config.data
  return config
}, error => {
  return error;
})

// 响应拦截器
api.interceptors.response.use(response => {
  if (response.config.headers.isLoading !== false && !response.config.url.includes('sys/notice/list')) {
    hideLoading()
  }
  //根据返回不同的状态码做不同的事情
  // 这里一定要和后台开发人员协商好统一的错误状态码

  if (response?.data?.status || response?.data?.code) {
    // let userInfo = localStorage.getItem('userData');
    // let userInfoJson = userInfo && JSON.parse(userInfo);
    let currentUser = getUserData();
    let refreshToken = currentUser['refresh_token'];
    switch (response?.data?.status || response?.data?.code) {
      case 200:
        // 判断当前请求是否设置了不显示Loading
        return response;
      case 401:
        //未登录处理方法
        message.error(response?.data?.message);
        window.location.href = '/unauthorized';
        break;
      case 403:
        //token过期处理方法
        // message.error(response?.data?.message);
        // //未登录处理方法
        // if(refreshToken){
        //     axios({
        //       url: REFRESHTOKENRUI,
        //       method: 'post',
        //       data: {
        //         refresh_token : refreshToken
        //       },
        //       headers:{
        //         "Content-Type": "application/json",
        //         'Ocp-Apim-Subscription-Key': OCPAPIMSUBSCRIPTIONKEY
        //       }
        //     }).then((res)=>{
        //       // 2. 保存新token
        //       // const userInfo = localStorage.getItem('userData');
        //       const userInfoJson = getUserData();
        //       const refreshUserData = { ...userInfoJson, access_token: res?.data['access_token'], expires_in: res?.data['expires_in'] };
        //       const dataStr = JSON.stringify(refreshUserData);
        //       localStorage.setItem('userData', dataStr);
        //       // 3. 重发请求
        //       // api是上面创建的axios的实例
        //       return api(response.config)
        //     },()=>{
        //       history.push('/')
        //     })
        // }else{
        //   history.push('/')
        // }
        history.push('/')
        break;
      default:
        message.error(enMsg[`${response?.data?.message}`] ? enMsg[`${response?.data?.message}`] : response?.data?.message)
    }
  } else {
    return response;
  }
},
  async (error) => {
    // 在接收到响应时发生错误时执行一些操作
    if (!error.config.url.includes('sys/notice/list')) {
      hideLoading()
    }
    const errStatus = error?.response?.data?.code !== 200;
    const errMsg = error?.response?.data?.message;
    if (errStatus) {
      switch (errStatus) {
        // case 200:
        //   // 判断当前请求是否设置了不显示Loading
        //   return error.response.data;
        // case 401:
        //   //未登录处理方法
        //   break;
        // case 403:
        //   //token过期处理方法
        //   break;
        default:
          message.error(errMsg)
      }
    } else {
      return message.error('Request error, please retry.');
    }
  },)
//最后把封装好的axios导出
export default api
